package bch.rocketmq;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.lang.invoke.VarHandle;

/**
 * org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#getEarlyBeanReference(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object)
 * 为什么只有a会进入断点 b不会?
 * A 是被依赖方 → 被提前暴露 → 进入 getEarlyBeanReference("a")。
 *
 * B 是依赖方 → 不需要提前暴露 → 不会进入 getEarlyBeanReference("b")。
 *
 * 代理也分 提前暴露和常规aop
 * b在populate时获取的是a的代理 B.a = 代理A
 *      B 自己初始化完成后，由于有 @Transactional，Spring 会对 B 本身生成代理对象(BeanPostProcessor#postProcessAfterInitialization)
 *      (org.springframework.aop.framework.autoproxy.InfrastructureAdvisorAutoProxyCreator)
 */
@Component
public class A {
    @Autowired
    private B b;

    @Transactional(rollbackFor = Exception.class, transactionManager = "chainedTransactionManager")
    public void a() {
        System.out.println("a");
    }
}
